package com.media.thread;

import com.media.cache.CacheUtil;
import com.media.config.MediaCaptorLiveConfig;
import com.media.pojo.CameraPojo;
import com.media.service.cameraPush.CameraHlsPush;
import com.media.service.cameraPush.CameraPush;
import com.media.service.cameraPush.CameraRtmpPush;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;

import java.lang.ref.WeakReference;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 摄像头的线程池
 **/
@Slf4j
public class CameraThread {
    public static class MyRunnable implements Runnable {

        /**
         * 创建线程池
         */
        public static ExecutorService es = Executors.newCachedThreadPool();

        /**
         * 摄像头信息
         */
        private CameraPojo cameraPojo;

        /**
         * 摄像头信息
         */
        private MediaCaptorLiveConfig mediaCaptorLiveConfig;
        /**
         * 当前 线程
         */
        private Thread nowThread;

        /**
         * 当前直播中线程中的进程信息
         */
        private WeakReference<Process> currentProcess;

        /**
         * 构造器
         */
        public MyRunnable(CameraPojo cameraPojo, MediaCaptorLiveConfig mediaCaptorLiveConfig) {
            this.cameraPojo = cameraPojo;
            this.mediaCaptorLiveConfig = mediaCaptorLiveConfig;
        }


        /**
         * 中断线程 (停止录制)
         */
        public void setInterrupted() {
//          1 : 判断当前线程中 , 是否开启了进行 (如果开启了 , 先停止进程)
            if (ObjectUtils.isNotEmpty(currentProcess)) {
                Process process = currentProcess.get();
                if (process != null) {
                    process.destroy();
                }
            }
//          2 :关闭当前线程
            nowThread.interrupt();
        }

        @Override
        public void run() {
//            直播流
            try {
//              1 : 获取当前线程存入缓存
                nowThread = Thread.currentThread();
//              2 : 记录已开启推流的摄像头
                CacheUtil.STREAM_MAP.put(cameraPojo.getToken(), cameraPojo);
//              3 : 开始推流
                CameraPush push;
                switch (cameraPojo.getPushType()) {
                    case HLS:
//                  3.1 : 执行 HLS 转流推流任务
                        push = new CameraHlsPush(cameraPojo, mediaCaptorLiveConfig).from();
                        break;
                    case RTMP:
//                  3.3 : 执行 RTMP 转流推流任务
                        push = new CameraRtmpPush(cameraPojo, mediaCaptorLiveConfig).from();
                        break;
                    default:
                        log.error("未知的推流类型 : {}", cameraPojo);
                        return;
                }
//              4 : 开始推流
                if (push != null) {
//                  3.2 : 开始推流
                    currentProcess = push.getCurrentProcess();
                    push.go();
                }
            } catch (
                    Exception e) {
                log.error("当前线程：{} 当前任务：{} 停止...", Thread.currentThread().getName(), cameraPojo.getRtsp(), e);
            } finally {
//              1 : 关闭线程
                setInterrupted();
//              2 : 清除缓存
                CacheUtil.STREAM_MAP.remove(cameraPojo.getToken());
                CacheUtil.JOB_MAP.remove(cameraPojo.getToken());
            }
        }
    }
}
